# 岭回归(ridge regression)
import numpy as np
from sklearn.linear_model import Ridge
# 交叉验证模块
from sklearn import model_selection
import matplotlib.pyplot as plt
# 创建多项式特征，如ab、a²、b²
from sklearn.preprocessing import PolynomialFeatures

# 数据介绍：
# 数据为某路口的交通流量监测数据，记录全年小时级别的车流量。
# 实验目的：
# 根据已有的数据 创建多项式特征，使用岭回归模型
# 对车流量的信息进行多项式回归。
# 数据特征如下：
# HR：一天中的第几个小时（0-23）
# WEEK_DAY：一周中的第几天（0-6）
# DAY_OF_YEAR：一年中的第几天（1-365）
# WEEK_OF_YEAR：一年中的第几周（1-53）
# TRAFFIC_COUNT：交通流量
# 全部数据集包含2万条以上数据（21626）

data = np.genfromtxt('data.txt')
# 展示车流量信息
plt.plot(data[:, 4])
# X用于保存 0-3维数据，即属性
X = data[:, :4]
# y用于保存 第4维数据，即车流量
y = data[:, 4]
# 创建最高次数6次方的的多项式特征，多次试验后决定采用6次
poly = PolynomialFeatures(6)
# X为创建的多项式特征
X = poly.fit_transform(X)

# 将所有数据划分为训练集和测试集，test_size表示测试集的比例，
# random_state是随机数种子
train_set_X, test_set_X, train_set_y, test_set_y = \
    model_selection.train_test_split(X, y, test_size=0.3, random_state=0)

# 创建岭回归实例
# alpha：正则化因子 损失函数中的α
# fit_intercept：表示是否计算截距
# solver：设置计算参数的方法 ‘auto’、‘svd’、‘sag’
clf = Ridge(alpha=1.0, fit_intercept=True)
# 使用训练集训练回归器
clf.fit(train_set_X, train_set_y)
# 利用测试集计算回归曲线的拟合优度，clf.score返回值为0.7375
# 拟合优度，用于评价拟合好坏，最大为1，无最小值
# 当对所有输入都输出同一个值时，拟合优度为0
clf.score(test_set_X, test_set_y)

# 画一段200到300范围内的拟合曲线
start = 200
end = 300
# 是调用predict函数的拟合值
y_pre = clf.predict(X)
time = np.arange(start, end)
# 真实数据（蓝色）
plt.plot(time, y[start:end], 'b', label="real")
# 拟合曲线（红色）
plt.plot(time, y_pre[start:end], 'r', label='predict')
plt.legend(loc='upper left')
plt.show()
